# 导入ｆｌａｓｋ内置的对象
from flask import request,jsonify,current_app,make_response
# 导入蓝图对象
from . import passport_blue
# 导入自定义状态码
from info.utils.response_code import RET
# 导入工具captcha
from info.utils.captcha.captcha import captcha
# 导入redis 数据库的实例
from info import redis_store,constants
# 导入正则
import re,random
# 导入云通讯
from info.libs.yuntongxun.sms import CCP



@passport_blue.route("/image_code")
def generate_image_code():
    # 获取参数
    image_code_id = request.args.get('image_code_id')
    # 判断参数是否存在，如果参数不存在　　直接终止程序运行
    if not image_code_id:
        return jsonify(errno = RET.PARAMERR,errmsg = '参数缺失')
    #     如果有uuid，调用工具captcha 生成图片验证码
    name,text,image=captcha.generate_captcha()
    # 吧图片验证码的ｔｅｘｔ内容存入redis 数据库中
    try:
         redis_store.setex('ImageCode_'+image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
         # 操作数据库　　如果发生异常　需记录项目日志
         current_app.logger.error(e)
         return jsonify(errno=RET.DBERR,errmsg = "保存数据失败")
    response = make_response(image)
    response.headers['Content-Type'] = 'image/jpg'
    return response


@passport_blue.route("/sms_code",methods = ['POST'])
def send_sms_code():
    """
    发送短信
    获取参数　　　　检查参数　　　业务处理　　返回结果
    １获取参数　　前段ａｊａｘ发送过来的手机号，图片验证码，图片验证码的标号ｕｕｉｄ
    ２检查参数的完整性，mobile, image_code,image_code_id
    3检查手机号的格式　　　用正则
    ４　尝试从redis 中获取真实的图片验证码，根据uuid 来从redis中拿出唯一的托ｉａｎ验证
    ５判断获取是否成功
    ６如果获取成功　应该吧redis中存储的图片验证码给删除
    ７比较图片验证码是否正确
    ８生成６位数的随机书　　　　作为短信验证码　　
    ９把短信验证码存入ｒｅｄｉｓ数据库中，便于后面用户注册时比较　
    １０　调用运通虚训发送短信　保存发送的结果
    １１　判断发送是否成功
    １２　返回结果
    :return:
    """
    # 获取参数
    mobile = request.json.get('mobile')
    image_code = request.json.get('image_code')
    image_code_id = request.json.get('image_code_id')
    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno = RET.PARAMERR,errmsg = '参数错误')
        # 检查手机号格式
        # 检查手机号格式
        # 检查手机号格式
    if not re.match(r'1[3456789]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')
    # 检查图片验证码　对比redis_中获取真实的图片验证码和用户的验证码进行比较
    try:
       real_image_code = redis_store.get('ImageCode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据失败')
    # 判断用户是否存在
    if not real_image_code:
        return jsonify(errno=RET.NODATA,errmsg = '数据已经过期')
    # 如果数据存在，把redis中的数据删除
    try:
        redis_store.delete('ImageCode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
    # 比较图片验证码是否正确
    if real_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR,errmsg='图片验证码错误')
    # 生成六位数短信随机码
    sms_code = '%06d' % random.randint(0,999999)
    print(sms_code)
    #存入redis数据库中
    try:
        redis_store.setex('SMSCode_' + mobile.constants.SMS_CODE_REDIS_EXPIREX,sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR,errmsg='保存短信验证码失败')
    # 调用云通讯,发送短信
    try:
        cpp = CCP()
        result=cpp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg='发送短信异常')
    # 判断发送的结果
    if result == 0:
        return jsonify(errno=RET.OK,errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR,errmsg='发送失败')









    """
    :return:
    """

    pass



